package com.swsc.ai.util;

import com.swsc.ai.constant.EnvConstant;
import org.apache.commons.lang3.StringUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;

import java.net.URI;

/**
 * @describe: hdfs处理工具
 * @author: DuanCXin
 * @created: 2023-10-11 10:49
 */
public class HDFSUtil {

    /**
     * 计算结果输出的hdfs路径（正式）
     * @param projectName
     * @param taskName
     * @param subTaskName
     * @param dt
     * @return
     */
    public static String getOutHDFSPath(String projectName, String taskName, String subTaskName, String dt) {
        StringBuffer strBuff = new StringBuffer(EnvConstant.HDFS_ENDPORT);
        strBuff.append("/" + projectName).append("/" + taskName).append("/" + subTaskName).append("/" + dt);
        return strBuff.toString();
    }

    /**
     * 计算结果输出的hdfs路径（测试）
     * @param className
     * @param subTaskName
     * @param dt
     * @return
     */
    public static String getTestOutHDFSPath(String className, String subTaskName, String dt) {
        StringBuffer strBuff = new StringBuffer(EnvConstant.HDFS_ENDPORT);
        strBuff.append("/test").append("/" + subTaskName).append("/" + className).append("/" + dt);
        return strBuff.toString();
    }

    /**
     * hdfs配置
     *
     * @return
     */
    private static Configuration getConfiguration() {
        Configuration configuration = new Configuration();
        configuration.set("fs.defaultFS", EnvConstant.HDFS_ENDPORT);
        return configuration;
    }

    /**
     * 获取HDFS文件系统对象
     *
     * @return
     * @throws Exception
     */

    public static FileSystem getFileSystem() throws Exception {
        // 客户端去操作hdfs时是有一个用户身份的，默认情况下hdfs客户端api会从jvm中获取一个参数作为自己的用户身份
        // DHADOOP_USER_NAME=hadoop
        // 也可以在构造客户端fs对象时，通过参数传递进去
        FileSystem fileSystem = FileSystem.get(new URI(EnvConstant.HDFS_ENDPORT), getConfiguration(), null);
        return fileSystem;
    }

    /**
     * 判断HDFS文件是否存在
     * @param path
     * @return
     * @throws Exception
     */
    public static boolean existFile(String path) throws Exception {
        if (StringUtils.isEmpty(path)) {
            return false;
        }
        FileSystem fs = getFileSystem();
        Path srcPath = new Path(path);
        return fs.exists(srcPath);
    }
}
